package com.kuangjia.conferenceroomrental.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kuangjia.conferenceroomrental.entity.Reservation;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 预约服务接口
 */
public interface ReservationService {
    
    /**
     * 创建预约
     */
    Reservation createReservation(Reservation reservation);
    
    /**
     * 根据ID获取预约
     */
    Reservation getReservationById(Long id);
    
    /**
     * 获取所有预约
     */
    List<Reservation> getAllReservations();
    
    /**
     * 分页获取所有预约
     */
    IPage<Reservation> getReservationsByPage(Page<Reservation> page);
    
    /**
     * 根据用户ID获取预约
     */
    List<Reservation> getReservationsByUserId(Long userId);
    
    /**
     * 根据用户ID分页获取预约
     */
    IPage<Reservation> getReservationsByUserIdPage(Page<Reservation> page, Long userId);
    
    /**
     * 根据会议室ID获取预约
     */
    List<Reservation> getReservationsByRoomId(Long roomId);
    
    /**
     * 根据会议室ID分页获取预约
     */
    IPage<Reservation> getReservationsByRoomIdPage(Page<Reservation> page, Long roomId);
    
    /**
     * 根据状态获取预约
     */
    List<Reservation> getReservationsByStatus(String status);
    
    /**
     * 根据状态分页获取预约
     */
    IPage<Reservation> getReservationsByStatusPage(Page<Reservation> page, String status);
    
    /**
     * 更新预约
     */
    Reservation updateReservation(Reservation reservation);
    
    /**
     * 删除预约
     */
    void deleteReservation(Long id);
    
    /**
     * 检查时间冲突（根据会议室ID）
     */
    boolean hasTimeConflict(Long roomId, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 检查时间冲突（根据会议室名称）
     */
    boolean hasTimeConflictByRoomName(String roomName, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取冲突的预约（根据会议室ID）
     */
    List<Reservation> getConflictingReservations(Long roomId, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取冲突的预约（根据会议室名称）
     */
    List<Reservation> getConflictingReservationsByRoomName(String roomName, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 精确查找指定时间范围内的预约（用于调试）
     */
    List<Reservation> findReservationsInTimeRange(Long roomId, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 审批预约
     */
    Reservation approveReservation(Long id);
    
    /**
     * 拒绝预约
     */
    Reservation rejectReservation(Long id);
    
    /**
     * 取消预约
     */
    Reservation cancelReservation(Long id);
    
    /**
     * 根据ISO格式的时间字符串检查时间冲突
     */
    boolean hasTimeConflictIso(Long roomId, String isoStartTime, String isoEndTime);
    
    /**
     * 根据ISO格式的时间字符串获取冲突的预约
     */
    List<Reservation> getConflictingReservationsIso(Long roomId, String isoStartTime, String isoEndTime);
    
    /**
     * 将ISO格式的时间字符串转换为LocalDateTime
     */
    LocalDateTime parseIsoDateTime(String isoDateTimeStr);
    
    /**
     * 将LocalDateTime格式化为ISO时间字符串
     */
    String formatToIsoDateTime(LocalDateTime dateTime);
} 